package it.gat.dao.impl;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import it.gat.dao.ClienteDAO;
import it.gat.dao.PermessoUtenteDAO;
import it.gat.dao.TecniciTipologiaDAO;
import it.gat.dao.UtenteDAO;
import it.gat.model.Cliente;
import it.gat.model.GruppoUtentiEnum;
import it.gat.model.Operatore;
import it.gat.model.Permesso;
import it.gat.model.TipologiaDispositivo;
import it.gat.model.Utente;
import it.gat.util.dao.MySQLDAOFactory;

public class MySQLUtenteDAOImpl implements UtenteDAO {

	@Override
	public void insert(Utente utente) throws SQLException {
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "";
		if ((utente instanceof Operatore))
		{
		query = "INSERT INTO Utente " +
		               "(nomeutente,password,cognome,nome,abilitazione,telefono,cellulare,gruppo) " +
		               "VALUES " +
		               "('"+utente.getNomeUtente()+"',"+
		               "'"+utente.getPassword()+"',"+
		               "'"+utente.getCognome()+"',"+
		               "'"+utente.getNome()+"',"+
		               ""+Boolean.toString(utente.getAbilitazione())+","+
		               "'"+utente.getTelefono()+"',"+
		               "'"+utente.getCellulare()+"',"+
		               "'"+utente.getGruppo().toString()+"')";
		}
		if (utente instanceof Cliente)
		{
			query = "INSERT INTO Utente " +
		               "(nomeutente,password,idcliente,cognome,nome,abilitazione,telefono,cellulare,gruppo) " +
		               "VALUES " +
		               "('"+utente.getNomeUtente()+"',"+
		               "'"+utente.getPassword()+"',"+
		               ""+Integer.toString(((Cliente)utente).getIdCliente())+","+
		               "'"+utente.getCognome()+"',"+
		               "'"+utente.getNome()+"',"+
		               ""+Boolean.toString(utente.getAbilitazione())+","+
		               "'"+utente.getTelefono()+"',"+
		               "'"+utente.getCellulare()+"',"+
		               "'"+utente.getGruppo().toString()+"')";
		}
		stmt.executeUpdate(query);
		PermessoUtenteDAO gruppoUtentiDAO = new MySQLPermessoUtenteDAOImpl();
		for(Permesso permesso:utente.getPermessi())
			gruppoUtentiDAO.insert(permesso,utente.getNomeUtente());
		if (utente instanceof Operatore)
		{
			TecniciTipologiaDAO tecniciTipologiaDAO = new MySQLTecniciTipologiaDAOImpl();
			for(TipologiaDispositivo tipologia:((Operatore)utente).getTipologieDispositivi())
			{
				tecniciTipologiaDAO.insert((Operatore)utente, tipologia);
			}
		}
	}

	@Override
	public Utente retriveByNomeUtente(String nomeUtente) throws SQLException {
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
		               "FROM Utente " + 
		               "WHERE nomeutente = '" + nomeUtente + "'";
		ResultSet rs = stmt.executeQuery(query);
		Utente utente = null;
		while (rs.next()) {
			GruppoUtentiEnum gruppo = GruppoUtentiEnum.valueOf(rs.getString("gruppo")); 
			switch (gruppo)
			{
			case AMMINISTRATORI:
			case TECNICI:
			case OPERATORI:
				utente = new Operatore();
				TecniciTipologiaDAO tecniciTipologiaDAO = new MySQLTecniciTipologiaDAOImpl();
				((Operatore)utente).setTipologieDispositivi(tecniciTipologiaDAO.retrieveTipologieByNomeUtente(rs.getString("nomeutente")));
				break;
			case CLIENTI:
				utente = new Cliente();
				ClienteDAO clienteDAO = new MySQLClienteDAOImpl();
				utente = clienteDAO.retriveById(rs.getInt("idcliente"));
				break;
			}
			utente.setGruppo(GruppoUtentiEnum.valueOf(rs.getString("gruppo")));
			utente.setNomeUtente(rs.getString("nomeutente"));
			utente.setPassword(rs.getString("password"));
			utente.setCognome(rs.getString("cognome"));
			utente.setNome(rs.getString("nome"));
			utente.setAbilitazione(rs.getBoolean("abilitazione"));
			utente.setTelefono(rs.getString("telefono"));
			utente.setCellulare(rs.getString("cellulare"));
			PermessoUtenteDAO permessoUtentiDAO = new MySQLPermessoUtenteDAOImpl();
			utente.setPermessi(permessoUtentiDAO.retrievePermessiByNomeUtente(rs.getString("nomeutente")));
			}
		return utente;
	}

	@Override
	public List<Utente> retrieveAll() throws SQLException {
		List<Utente> utenti = new ArrayList<Utente>();
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
		               "FROM Utente ";
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
			Utente utente = null;
			GruppoUtentiEnum gruppo = GruppoUtentiEnum.valueOf(rs.getString("gruppo")); 
			switch (gruppo)
			{
			case AMMINISTRATORI:
			case TECNICI:
			case OPERATORI:
				utente = new Operatore();
				TecniciTipologiaDAO tecniciTipologiaDAO = new MySQLTecniciTipologiaDAOImpl();
				tecniciTipologiaDAO.retrieveTipologieByNomeUtente(rs.getString("nomeutente"));
				break;
			case CLIENTI:
				utente = new Cliente();
				ClienteDAO clienteDAO = new MySQLClienteDAOImpl();
				utente = clienteDAO.retriveById(rs.getInt("idcliente"));
				break;
			}
			utente.setGruppo(GruppoUtentiEnum.valueOf(rs.getString("gruppo")));
			utente.setNomeUtente(rs.getString("nomeutente"));
			utente.setPassword(rs.getString("password"));
			utente.setCognome(rs.getString("cognome"));
			utente.setNome(rs.getString("nome"));
			utente.setAbilitazione(rs.getBoolean("abilitazione"));
			utente.setTelefono(rs.getString("telefono"));
			utente.setCellulare(rs.getString("cellulare"));
			PermessoUtenteDAO permessoUtentiDAO = new MySQLPermessoUtenteDAOImpl();
			utente.setPermessi(permessoUtentiDAO.retrievePermessiByNomeUtente(rs.getString("nomeutente")));
			utenti.add(utente);
			}
		return utenti;
	}
	
	public List<String> retrieveAllNomeUtenti() throws SQLException{
		List<String> utenti = new ArrayList<String>();
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "SELECT * " +
		               "FROM Utente ";
		ResultSet rs = stmt.executeQuery(query);
		while (rs.next()) {
				utenti.add(rs.getString("nomeutente"));
			}
		return utenti;
	}

	@Override
	public void update(Utente utente) throws SQLException {
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "";
		if (utente instanceof Operatore)
		{
			   query = "UPDATE Utente " +
		               "SET password='"+utente.getPassword()+"',"+
		                "cognome='"+utente.getCognome()+"',"+
		                "nome='"+utente.getNome()+"',"+
		                "abilitazione="+Boolean.toString(utente.getAbilitazione())+","+
		                "telefono='"+utente.getTelefono()+"',"+
		                "cellulare='"+utente.getCellulare()+"' "+
		               "WHERE (nomeutente='"+utente.getNomeUtente()+"')";
		}
		if (utente instanceof Cliente)
		{
			   query = "UPDATE Utente " +
		               "SET password='"+utente.getPassword()+"',"+
		                "cognome='"+utente.getCognome()+"',"+
		                "nome='"+utente.getNome()+"',"+
		                "abilitazione="+Boolean.toString(utente.getAbilitazione())+","+
		                "telefono='"+utente.getTelefono()+"',"+
		                "cellulare='"+utente.getCellulare()+"',"+
		                "idcliente="+Integer.toString(((Cliente)utente).getIdCliente())+" "+
		               "WHERE (nomeutente='"+utente.getNomeUtente()+"')";
		}
		stmt.executeUpdate(query);
		PermessoUtenteDAO permessoUtentiDAO = new MySQLPermessoUtenteDAOImpl();
		permessoUtentiDAO.deletePermessi(utente);
		for(Permesso permesso:utente.getPermessi())
			permessoUtentiDAO.insert(permesso,utente.getNomeUtente());
		if (utente instanceof Operatore)
		{
			TecniciTipologiaDAO tecniciTipologiaDAO = new MySQLTecniciTipologiaDAOImpl();
			tecniciTipologiaDAO.deleteTipologie((Operatore) utente);
			for(TipologiaDispositivo tipologia:((Operatore)utente).getTipologieDispositivi())
			{
				tecniciTipologiaDAO.insert((Operatore)utente, tipologia);
			}
		}

	}

	@Override
	public void delete(String nomeUtente) throws SQLException {
		Utente utente = retriveByNomeUtente(nomeUtente);
		if (utente instanceof Operatore)
		{
			TecniciTipologiaDAO tecniciTipologiaDAO = new MySQLTecniciTipologiaDAOImpl();
			tecniciTipologiaDAO.deleteTipologie((Operatore) this.retriveByNomeUtente(nomeUtente));
		}
		PermessoUtenteDAO permessoUtentiDAO = new MySQLPermessoUtenteDAOImpl();
		permessoUtentiDAO.deletePermessi(this.retriveByNomeUtente(nomeUtente));
		Connection conn = MySQLDAOFactory.createConnection(); 
		Statement stmt = conn.createStatement();
		String query = "DELETE FROM Utente " +
				"WHERE nomeUtente='"+nomeUtente+"'";
		stmt.executeUpdate(query);
	}

	/*
	@Override
	public Operatore retriveOperatoreByNomeUtente(String nomeUtente) throws SQLException {
	Operatore utente = new Operatore();
	Connection conn = MySQLDAOFactory.createConnection(); 
	Statement stmt = conn.createStatement();
	String query = "SELECT * " +
	               "FROM Utente INNER JOIN GruppoUtenti ON utente.nomeutente=gruppoutenti.nomeutente "+
			       "WHERE gruppo='"+GruppoUtentiEnum.OPERATORI.toString()+"' AND "+
			       "      utente.nomeutente='"+nomeUtente+"'";
	ResultSet rs = stmt.executeQuery(query);
	while (rs.next()) {
		utente.setNomeUtente(rs.getString("nomeutente"));
		utente.setPassword(rs.getString("password"));
		utente.setRagioneSociale(rs.getString("ragionesociale"));
		utente.setCognome(rs.getString("cognome"));
		utente.setNome(rs.getString("nome"));
		utente.setAbilitazione(rs.getBoolean("abilitazione"));
		utente.setTelefono(rs.getString("telefono"));
		utente.setCellulare(rs.getString("cellulare"));
		PermessoUtenteDAO gruppoUtentiDAO = new MySQLPermessoUtenteDAOImpl();
		utente.setGruppiUtente(gruppoUtentiDAO.retrieveGruppoUtentiByNomeUtente(rs.getString("nomeutente")));
		}
	return utente;
	}
	*/

	/*
	@Override
	public Tecnico retriveTecnicoByNomeUtente(String nomeUtente) throws SQLException {
	Tecnico utente = new Tecnico();
	Connection conn = MySQLDAOFactory.createConnection(); 
	Statement stmt = conn.createStatement();
	String query = "SELECT * " +
	               "FROM Utente INNER JOIN GruppoUtenti ON utente.nomeutente=gruppoutenti.nomeutente "+
			       "WHERE gruppo='"+GruppoUtentiEnum.TECNICI.toString()+"' AND "+
			       "      utente.nomeutente='"+nomeUtente+"'";
	ResultSet rs = stmt.executeQuery(query);
	while (rs.next()) {
		utente.setNomeUtente(rs.getString("nomeutente"));
		utente.setPassword(rs.getString("password"));
		utente.setRagioneSociale(rs.getString("ragionesociale"));
		utente.setCognome(rs.getString("cognome"));
		utente.setNome(rs.getString("nome"));
		utente.setAbilitazione(rs.getBoolean("abilitazione"));
		utente.setTelefono(rs.getString("telefono"));
		utente.setCellulare(rs.getString("cellulare"));
		PermessoUtenteDAO gruppoUtentiDAO = new MySQLPermessoUtenteDAOImpl();
		utente.setGruppiUtente(gruppoUtentiDAO.retrieveGruppoUtentiByNomeUtente(rs.getString("nomeutente")));
		TecniciTipologiaDAO tecniciTipologiaDAO = new MySQLTecniciTipologiaDAOImpl();
		utente.setTipologieDispositivi(tecniciTipologiaDAO.retrieveTipologieByNomeUtente(rs.getString("nomeutente")));
		}
	return utente;
	}
	*/
	
	@Override
	public List<Operatore> retriveTecnicoByIdTipologia(int idTipologiaDispositivo) throws SQLException {
	List<Operatore> tecnici = new ArrayList<Operatore>();
	Connection conn = MySQLDAOFactory.createConnection(); 
	Statement stmt = conn.createStatement();
	String query = "SELECT * " +
	               "FROM Utente INNER JOIN TecniciTipologia ON utente.nomeutente=tecnicitipologia.nomeutente "+
			       "WHERE idtipologiadispositivo="+idTipologiaDispositivo;
	ResultSet rs = stmt.executeQuery(query);
	while (rs.next()) {
		Operatore utente = new Operatore();
		utente.setNomeUtente(rs.getString("nomeutente"));
		utente.setPassword(rs.getString("password"));
		utente.setCognome(rs.getString("cognome"));
		utente.setNome(rs.getString("nome"));
		utente.setAbilitazione(rs.getBoolean("abilitazione"));
		utente.setTelefono(rs.getString("telefono"));
		utente.setCellulare(rs.getString("cellulare"));
		utente.setGruppo(GruppoUtentiEnum.valueOf(rs.getString("gruppo")));
		PermessoUtenteDAO permessoUtentiDAO = new MySQLPermessoUtenteDAOImpl();
		utente.setPermessi(permessoUtentiDAO.retrievePermessiByNomeUtente(rs.getString("nomeutente")));
		TecniciTipologiaDAO tecniciTipologiaDAO = new MySQLTecniciTipologiaDAOImpl();
		utente.setTipologieDispositivi(tecniciTipologiaDAO.retrieveTipologieByNomeUtente(rs.getString("nomeutente")));
		tecnici.add(utente);
		}
	return tecnici;
	}
	
	@Override
	public List<Operatore> retriveTecnicoList() throws SQLException {
	List<Operatore> tecnici = new ArrayList<Operatore>();
	Connection conn = MySQLDAOFactory.createConnection(); 
	Statement stmt = conn.createStatement();
	String query = "SELECT * " +
                   "FROM Utente "+
		           "WHERE gruppo='"+GruppoUtentiEnum.TECNICI.toString()+"'";
	ResultSet rs = stmt.executeQuery(query);
	while (rs.next()) {
		Operatore utente = new Operatore();
		utente.setNomeUtente(rs.getString("nomeutente"));
		utente.setPassword(rs.getString("password"));
		utente.setCognome(rs.getString("cognome"));
		utente.setNome(rs.getString("nome"));
		utente.setAbilitazione(rs.getBoolean("abilitazione"));
		utente.setTelefono(rs.getString("telefono"));
		utente.setCellulare(rs.getString("cellulare"));
		utente.setGruppo(GruppoUtentiEnum.valueOf(rs.getString("gruppo")));
		PermessoUtenteDAO permessoUtentiDAO = new MySQLPermessoUtenteDAOImpl();
		utente.setPermessi(permessoUtentiDAO.retrievePermessiByNomeUtente(rs.getString("nomeutente")));
		TecniciTipologiaDAO tecniciTipologiaDAO = new MySQLTecniciTipologiaDAOImpl();
		utente.setTipologieDispositivi(tecniciTipologiaDAO.retrieveTipologieByNomeUtente(rs.getString("nomeutente")));
		tecnici.add(utente);
		}
	return tecnici;
	}

}
